package main

import (
	"unicode"
)

// 我自己写的。 没有用一个内置的方法。
func shortestCompletingWord(licensePlate string, words []string) string {
	// 1. 统计licensePlate字母
	letMap := make(map[byte]int, 0)
	for i := 0; i < len(licensePlate); i++ {
		// 统计字符数量
		if c, ok := isLetter(licensePlate[i]); ok {
			letMap[c] += 1
		}
	}
	minWord := ""
	// 2. 遍历 words 字符数组，找到最小的
	for _, word := range words {
		// 每个word统计计数
		wordArr := make([]int, 26)
		for i := 0; i < len(word); i++ {
			wordArr[word[i] - 'a'] += 1
		}
		// 比较是否成立
		flag := true
		for k, v := range letMap {
			if wordArr[k - 'a'] < v {
				flag = false
				break
			}
		}
		if flag && (minWord == "" || len(minWord) > len(word)) {
			minWord = word
		}
	}
	return minWord
}


// 判断一个字符是否是 英文字母，并返回小写形式
func isLetter(c byte) (byte, bool) {
	if c >= 'A' && c <= 'Z' {
		return c + 32, true
	}
	if c >= 'a' && c <= 'z' {
		return c, true
	}
	return 0, false
}


// next标签， 官方实现很优雅呀~
func shortestCompletingWord1(licensePlate string, words []string) (ans string) {
	cnt := [26]int{}
	for _, ch := range licensePlate {
		// 调用方法，判断是否是字母，并转换为小写
		if unicode.IsLetter(ch) {
			cnt[unicode.ToLower(ch)-'a']++
		}
	}

next:
	for _, word := range words {
		c := [26]int{}
		for _, ch := range word { // range遍历出来的可以直接和 'a' 进行加减。
			c[ch-'a']++
		}
		for i := 0; i < 26; i++ {
			if c[i] < cnt[i] {
				continue next
			}
		}
		if ans == "" || len(word) < len(ans) {
			ans = word
		}
	}
	return
}


